/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.common.ISubject;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteLocal;
import pe.com.cotelasa.scp.controlador.backingBean.BKUbigeo;
import pe.com.cotelasa.scp.controlador.backingBean.BKUbigeoSede;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioUbigeo;
import pe.com.cotelasa.scp.entidad.Pais;
import pe.com.cotelasa.scp.entidad.Ubigeo;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author usuario
 */
@Named(value = "MBUbigeoSede")
@Scope("application")
public class MBUbigeoSede implements Serializable {

    private static Logger logger = Logger.getLogger(MBUbigeoSede.class);
    @Inject
    private IServicioUbigeo servicioUbigeo;
    @Inject
    private BKUbigeoSede bkUbigeo;
    @Inject
    private BKComponenteLocal bkLocal;
    @Autowired
    BKSession session;

    public void inicializar(ActionEvent actionEvent) {
        try {
            bkUbigeo.inicializarValores(null, null, false, null);
            bkUbigeo.setListaPaises(servicioUbigeo.listarTodosPaises());

            if (bkUbigeo.getUbigeoSeleccionado() != null) {
                operarSobrePaisSeleccionado();
                bkUbigeo.setCiudadSeleccionada("0000" + bkUbigeo.getUbigeoSeleccionado().getCodigo().substring(4));
                if (bkUbigeo.isEstaPeruSeleccionado() == true) {
                    operarSobreCiudadSeleccionada();
                    bkUbigeo.setProvinciaSeleccionada("00" + bkUbigeo.getUbigeoSeleccionado().getCodigo().substring(2));
                    operarSobreProvinciaSeleccionada();
                    bkUbigeo.setDistritoSeleccionado(bkUbigeo.getUbigeoSeleccionado().getCodigo());

                }
            }
        } catch (ServiceException e) {
            e.printStackTrace();
        }
    }

    public Collection<Pais> buscarPais(String paisABuscar) {
        Collection<Pais> listaPaisesEncontrados = new ArrayList<Pais>();
        for (Pais pais : bkUbigeo.getListaPaises()) {
            if (pais.getNombre().startsWith(paisABuscar)) {
                listaPaisesEncontrados.add(pais);
            }
        }
        return listaPaisesEncontrados;
    }

    public Collection<Ubigeo> buscarCiudad(String ciudadABuscar) {
        Collection<Ubigeo> listaCiudadesEncontradas = new ArrayList<Ubigeo>();
        for (Ubigeo ciudad : bkUbigeo.getListaCiudades()) {
            if (ciudad.getNombre().startsWith(ciudadABuscar)) {
                listaCiudadesEncontradas.add(ciudad);
            }
        }
        return listaCiudadesEncontradas;
    }

    public void operarSobrePaisSeleccionado() {
        bkUbigeo.setCiudadSeleccionada(null);
        bkUbigeo.setProvinciaSeleccionada(null);
        bkUbigeo.setDistritoSeleccionado(null);
        try {
            if (bkUbigeo.getPaisSeleccionado() != null) {
                bkUbigeo.setEstaPeruSeleccionado(bkUbigeo.getPaisSeleccionado().getId() == 177 ? true : false);

                bkUbigeo.setListaUbigeos(servicioUbigeo.listarCiudadesPorPais(bkUbigeo.getPaisSeleccionado()));
                bkUbigeo.setListaCiudades(new ArrayList<Ubigeo>());
                for (Ubigeo ubigeo : bkUbigeo.getListaUbigeos()) {
                    if (ubigeo.getCodigo().startsWith("0000")) {
                        bkUbigeo.getListaCiudades().add(ubigeo);
                    }
                }
            } else {
                bkUbigeo.setListaCiudades(null);
            }
            //System.out.println("ciudades " + bkUbigeo.getListaCiudades());
        } catch (ServiceException ex) {
            logger.error(ex.getMessage(), ex);
        }
    }

    public void operarSobreCiudadSeleccionada() {
        try {
            bkUbigeo.setProvinciaSeleccionada(null);
            bkUbigeo.setDistritoSeleccionado(null);

            if (bkUbigeo.getCiudadSeleccionada() != null) {
                bkUbigeo.setListaProvincias(new ArrayList<Ubigeo>());
                String codigoCiudad = bkUbigeo.getCiudadSeleccionada().substring(4);
                for (Ubigeo ubigeo : bkUbigeo.getListaUbigeos()) {
                    if (ubigeo.getCodigo().startsWith("00") && !ubigeo.getCodigo().startsWith("0000") && ubigeo.getCodigo().endsWith(codigoCiudad)) {
                        bkUbigeo.getListaProvincias().add(ubigeo);
                    }
                }
            } else {
                bkUbigeo.setListaProvincias(null);
            }
        } catch (Exception e) {
            System.err.println(e);
        }

    }

    public void operarSobreProvinciaSeleccionada() {

        bkUbigeo.setDistritoSeleccionado(null);
        if (bkUbigeo.getProvinciaSeleccionada() != null) {
            bkUbigeo.setListaDistrito(new ArrayList<Ubigeo>());
            String codigoProvincia = bkUbigeo.getProvinciaSeleccionada().substring(2);
            for (Ubigeo ubigeo : bkUbigeo.getListaUbigeos()) {
                if (!ubigeo.getCodigo().startsWith("00") && ubigeo.getCodigo().endsWith(codigoProvincia)) {
                    bkUbigeo.getListaDistrito().add(ubigeo);
                }
            }
        } else {
            bkUbigeo.setListaDistrito(null);
        }

    }

    public void aplicarUbigeoSede() {
        Ubigeo ubigeoBusqueda = new Ubigeo();
        String descripcionUbigeo = bkUbigeo.getPaisSeleccionado().getNombre();
        try {
            ubigeoBusqueda.setIdPais(bkUbigeo.getPaisSeleccionado());
            if (bkUbigeo.isEstaPeruSeleccionado() == true) {
                /**
                 * ************** Ciudad *****************
                 */
                ubigeoBusqueda.setCodigo(bkUbigeo.getCiudadSeleccionada());
                bkLocal.getFormularioLocal().setIdUbigeo(servicioUbigeo.obtenerUbigeoPorCodigo(ubigeoBusqueda));
                descripcionUbigeo += "/" + bkLocal.getFormularioLocal().getIdUbigeo().getNombre();
                /**
                 * ************** Provincia *****************
                 */
                ubigeoBusqueda.setCodigo(bkUbigeo.getProvinciaSeleccionada());
                descripcionUbigeo += "/" + servicioUbigeo.obtenerUbigeoPorCodigo(ubigeoBusqueda).getNombre() + "/";
                /**
                 * ************** Distrito *****************
                 */
                ubigeoBusqueda.setCodigo(bkUbigeo.getDistritoSeleccionado());
                bkLocal.getFormularioLocal().setIdUbigeo(servicioUbigeo.obtenerUbigeoPorCodigo(ubigeoBusqueda));
                descripcionUbigeo += bkLocal.getFormularioLocal().getIdUbigeo().getNombre();
            } else {
                ubigeoBusqueda.setCodigo("000001");
                bkLocal.getFormularioLocal().setIdUbigeo(servicioUbigeo.obtenerUbigeoPorCodigo(ubigeoBusqueda));
            }
            bkLocal.getFormularioLocal().setDescUbicacion(descripcionUbigeo);

        } catch (ServiceException ex) {
            logger.error(ex.getMessage(), ex);
        }

    }
}
